﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.SqlClient;
using System.Configuration;
using System.Data;

/// <summary>
///     <para>
///         Klasa za postavuvanje na ocenite na studentite koi gi slusaat tekovnite predmeti, na odreden profesor.
///     </para>
/// </summary>
public partial class p_Oceni : System.Web.UI.Page
{

    ///<summary>
    /// <para>
    ///     Vo Page_Load funkcijata se proveruva dali e dozvolen pristapot kon istata i dokolku e, se ispolnuvaat
    ///     soodvetnite label kontroli.
    /// </para>
    ///</summary>
    ///<param name="sender"></param>
    ///<param name="e"></param>

    protected void Page_Load(object sender, EventArgs e)
    {
        //Proverka dali e dozvolen pristap do tekovnata strana
        //Dokolku ne e, korisnikot se prenesuva kon soodvetnata strana
        if ((int)Session["tip"] != 2) Response.Redirect("NO.aspx");
        else Session["strana"] = Request.RawUrl.ToString();

        //Postavuvanje vrednostite na kontrolite za prikaz na imeto i dodatnite informacii na tekovniot korisnik
        if (!IsPostBack)
        {
            lblIme.Text = "Име: " + Session["ime"].ToString();
            lblPrezime.Text = "Презиме: " + Session["prezime"].ToString();
            ispolni_Lista();
        }
    }

    /// <summary>
    ///     <para>
    ///     Funkcija za ispolnuvanje na listata za prikaz na predmeti na tekovniot profesor
    ///     </para>
    /// </summary>

    protected void ispolni_Lista()
    {   
        //Kreiranje na konekcija kon bazata za vrakjanje na predmeti koi gi predava tekovniot profesor
        SqlConnection konekcija = new SqlConnection();
        konekcija.ConnectionString = ConfigurationManager.ConnectionStrings["mojaKonekcija"].ConnectionString;
        SqlCommand komanda = new SqlCommand();
        komanda.Connection = konekcija;     
        komanda.CommandText = "SELECT DISTINCT p.Predmet FROM  Predmet AS p, Predava AS pr WHERE pr.predmet_ID=p.p_ID AND pr.prof_ID='" + Session["korisnicko"].ToString() + "'";
        try
        {
            konekcija.Open();
            SqlDataReader citac = komanda.ExecuteReader();
            while (citac.Read())
            {
                ListItem element = new ListItem();
                element.Text = citac["Predmet"].ToString();
                lstPredmeti.Items.Add(element);
            }
            citac.Close();
        }
        catch (Exception er) { }
        finally
        {
            konekcija.Close();
        }
    }


    /// <summary>
    ///     <para>
    ///         Event handler koj se povikuva pri selektiranje na zapis od listata na predmeti
    ///     </para>
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>

    protected void lstPredmeti_SelectedIndexChanged(object sender, EventArgs e)
    {
        gvStudenti.EditIndex = -1;
        ispolni_Grid();
    }

    /// <summary>
    ///     <para>Se zemaat imeto, prezimeto, indeksot i laboratoriskite vezbi na sekoj student sto go slusa selektiraniot predmet kaj korisnikot 
    ///         kako i imeto, prezimeto, indeksot i ocenata na sekoj student sto go polozil istiot predmet kaj korisnikot. So informaciite se polnat dve gridview-a. 
    ///         Kaj studentite sto go nemaat polozeno predmetot poleto za ocena ostanuva prazno. Kaj studentite sto go imaat polozeno predmetot polinjata za laboratoriski 
    ///         vezbi se polnat so vrednost true.
    ///     </para>
    /// </summary>
    protected void ispolni_Grid()
    {
        gvStudenti.Visible = true;

        //Kreiranje na konekcija so bazata na podatoci
        SqlConnection konekcija = new SqlConnection();
        konekcija.ConnectionString = ConfigurationManager.ConnectionStrings["mojaKonekcija"].ConnectionString;

        //Kreiranje na SQL query
        SqlCommand komanda = new SqlCommand();
        komanda.Connection = konekcija;
        komanda.CommandText = "SELECT k.Ime, k.Prezime, ss.indeks, null as ocena, s.eden, s.dva, s.tri, s.cetiri, s.pet, s.sest, s.sedum FROM Slusa AS s, Korisnici as k, Student AS ss, Predmet as p WHERE s.s_student=k.KorIme AND s.s_prof='" + Session["korisnicko"].ToString() + "' AND s.s_student=ss.s_KorIme AND p.p_ID=s.s_predmet AND p.Predmet='" + lstPredmeti.SelectedItem.Text + "' UNION SELECT k.Ime, k.Prezime, ss.Indeks, o.ocena,'true', 'true', 'true', 'true', 'true', 'true', 'true'  FROM Korisnici as k, Student AS ss, Predmet as p, Ocena as o WHERE o.o_s_student=k.KorIme AND p.p_ID=o.o_s_predmet AND ss.s_KorIme=o.o_s_student AND p.Predmet='" + lstPredmeti.SelectedItem.Text + "'";

        SqlDataAdapter adapter = new SqlDataAdapter(komanda);
        DataSet ds = new DataSet();
        try
        {
            //Polnenje na GridView-to
            konekcija.Open();
            adapter.Fill(ds, "Studenti");
            gvStudenti.DataSource = ds;
            gvLab.DataSource = ds;
            gvStudenti.DataBind();
            gvLab.DataBind();
            ViewState["dataset"] = ds;
        }
        catch (Exception er) { }
        finally
        {
            //Zatvoranje na konekcijata do bazata
            konekcija.Close();
        }
    }

    /// <summary>
    ///     <para>
    ///         Handler koj se povikuva koga se kliknuva kopceto Otkazi vo GridView-to gvStudenti. Se trga selekcijata na GridView-to i se ispolnuva povtorno.
    ///     </para>
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void gvStudenti_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
    {
        DataSet ds = (DataSet)ViewState["dataset"];
        gvStudenti.EditIndex = -1;
        gvStudenti.DataSource = ds;
        gvStudenti.DataBind();   
    }

    /// <summary>
    ///     <para>
    ///         Handler koj se povikuva pri kliknuvanje na kopceto za menuvanje na ocena vo gridview-to gvStudenti.
    ///     </para>
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void gvStudenti_RowEditing(object sender, GridViewEditEventArgs e)
    {
        DataSet ds = (DataSet)ViewState["dataset"];
        gvStudenti.EditIndex = e.NewEditIndex;
        gvStudenti.DataSource = ds;
        gvStudenti.DataBind();
    }

    /// <summary>
    ///     <para>
    ///         Se ostvaruva konekcija do baza. Se zapocnuva so promeni na ocenata na selektiraniot student koj go slusa selektiraniot predmet koj go predava korisnikot.
    ///         Ako executeNonQuery vrati 0 se vnesuva podatok vo tabelata Ocena za selektiraniot predmet i student i ocenata koja ja vnesol korisnikot i se brise podatokot od tabelata 
    ///         Slusa za selektiraniot predmet i student.
    ///     </para>    
    ///     <para>
    ///         Se povikuva metodot za ispolnuvanje na gridview ispolni_Grid().
    ///     </para>
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void gvStudenti_RowUpdating(object sender, GridViewUpdateEventArgs e)
    {
        //Kreiranje na konekcija kon bazata
        SqlConnection konekcija = new SqlConnection();
        konekcija.ConnectionString = ConfigurationManager.ConnectionStrings["mojaKonekcija"].ConnectionString;

        //Kreiranje na SQL query
        SqlCommand komanda = new SqlCommand();
        komanda.Connection = konekcija;
        komanda.CommandText = "UPDATE o SET o.ocena=@ocena FROM Ocena AS o, Student AS s, Predmet AS p WHERE s.s_KorIme=o.o_s_student AND o.o_s_predmet=p.p_ID AND p.Predmet='"+lstPredmeti.SelectedItem.Text+"' AND s.Indeks='" + gvStudenti.Rows[e.RowIndex].Cells[2].Text + "'";
        TextBox tb = (TextBox)gvStudenti.Rows[e.RowIndex].Cells[3].Controls[0];
        komanda.Parameters.AddWithValue("@ocena", tb.Text);
        try
        { 
            konekcija.Open();
            komanda.ExecuteNonQuery();
            

            if (komanda.ExecuteNonQuery() == 0)
            {
                //Se dodava ocena za selektiraniot predmet za soodvetniot student.
                komanda.CommandText = "INSERT INTO ocena (o_s_student, o_s_predmet, ocena) SELECT s.s_student, s.s_predmet,@ocena FROM Slusa AS s, Student as ss WHERE ss.Indeks='" + gvStudenti.Rows[e.RowIndex].Cells[2].Text + "' AND ss.s_KorIme=s.s_student"; //komanda za dodavanje
                komanda.ExecuteNonQuery();

                //Predmetot za koj e vnesena ocenata kaj soodvetniot student, se otstranuva od tabelata Slusa, odnosno se postavuva kako polozen.
                komanda.CommandText = "DELETE FROM Slusa WHERE EXISTS( SELECT * FROM Student AS s WHERE s.Indeks='" + gvStudenti.Rows[e.RowIndex].Cells[1].Text + "' AND s.s_KorIme=Slusa.s_student)"; //komanda za brisenje od tabela
                komanda.ExecuteNonQuery();
            }
        }
        catch (Exception er) { }
        finally
        {
            //Zatvoranje na konekcijata
            konekcija.Close();
            gvStudenti.EditIndex = -1;
        }
        ispolni_Grid();
    }

    /// <summary>
    ///     <para>
    ///         Se zapocnuva so promena na laboratoriskite vezbi vo tabela Slusa za selektiraniot student i predmet. 
    ///         Dokolku ExecuteNonQuery vrati 0 se otkazuva promena i vo labela se ispisuva deka studentot veke polozil.
    ///     </para>
    ///     <para>
    ///         Se povikuva metodot ispolni_Grid().
    ///     </para>
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void gvLab_RowUpdating(object sender, GridViewUpdateEventArgs e)
    {
        //Kreiranje konekcija kon bazata
        SqlConnection konekcija = new SqlConnection();
        konekcija.ConnectionString = ConfigurationManager.ConnectionStrings["mojaKonekcija"].ConnectionString;

        //Kreiranje na SQL query
        SqlCommand komanda = new SqlCommand();
        komanda.Connection = konekcija;
        komanda.CommandText = "UPDATE ss SET ss.eden=@eden, ss.dva=@dva, ss.tri=@tri, ss.cetiri=@cetiri, ss.pet=@pet, ss.sest=@sest, ss.sedum=@sedum FROM Slusa AS ss, Student AS s, Predmet AS p WHERE s.s_KorIme=ss.s_student AND ss.s_predmet=p.p_ID AND p.Predmet='" + lstPredmeti.SelectedItem.Text + "' AND s.Indeks='" + gvStudenti.Rows[e.RowIndex].Cells[2].Text + "' AND ss.s_prof='"+Session["korisnicko"].ToString()+"'";

        CheckBox cb = (CheckBox)gvLab.Rows[e.RowIndex].Cells[0].Controls[0];
        komanda.Parameters.AddWithValue("@eden", cb.Checked);
        cb = (CheckBox)gvLab.Rows[e.RowIndex].Cells[1].Controls[0];
        komanda.Parameters.AddWithValue("@dva", cb.Checked);
        cb = (CheckBox)gvLab.Rows[e.RowIndex].Cells[2].Controls[0];
        komanda.Parameters.AddWithValue("@tri", cb.Checked);
        cb = (CheckBox)gvLab.Rows[e.RowIndex].Cells[3].Controls[0];
        komanda.Parameters.AddWithValue("@cetiri", cb.Checked);
        cb = (CheckBox)gvLab.Rows[e.RowIndex].Cells[4].Controls[0];
        komanda.Parameters.AddWithValue("@pet", cb.Checked);
        cb = (CheckBox)gvLab.Rows[e.RowIndex].Cells[5].Controls[0];
        komanda.Parameters.AddWithValue("@sest", cb.Checked);
        cb = (CheckBox)gvLab.Rows[e.RowIndex].Cells[6].Controls[0];
        komanda.Parameters.AddWithValue("@sedum", cb.Checked);
        try
        {
            konekcija.Open();
            komanda.ExecuteNonQuery();
            lblInfo.Text = string.Empty;
            if (komanda.ExecuteNonQuery() == 0)
            {
                lblInfo.Text = "Студентот веќе има оцена.";
                DataSet ds = (DataSet)ViewState["dataset"];
                gvLab.EditIndex = -1;
                gvLab.DataSource = ds;
                gvLab.DataBind();
            }
        }
        catch (Exception er) { }
        finally
        {   
            //Zatvoranje na konekcijata kon bazata.
            konekcija.Close();
            gvLab.EditIndex = -1;
        }
        ispolni_Grid();
    }

    /// <summary>
    ///     <para>
    ///         Handler koj se povikuva koga se kliknuva kopceto Otkazi vo gridview-to gvLab. 
    ///         Se trga selekcijata na gridview-to i se ispolnuva povtorno.
    ///     </para>
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void gvLab_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
    {
        DataSet ds = (DataSet)ViewState["dataset"];
        gvLab.EditIndex = -1;
        gvLab.DataSource = ds;
        gvLab.DataBind();
    }

    /// <summary>
    ///     <para>
    ///         Handler koj se povikuva pri kliknuvanje na kopceto za menuvanje na ocena vo gridview-to gvLab.
    ///     </para>
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void gvLab_RowEditing(object sender, GridViewEditEventArgs e)
    {
        DataSet ds = (DataSet)ViewState["dataset"];
        gvLab.EditIndex = e.NewEditIndex;
        gvLab.DataSource = ds;
        gvLab.DataBind();
    }
}